home *** CD-ROM | disk | FTP | other *** search
/ Resource for Source: C/C++ / Resource for Source - C-C++.iso / misc_src / knowhow4 / ask.cpp < prev    next >
C/C++ Source or Header  |  1995-11-01  |  7KB  |  234 lines

  1. #include "ask.h"
  2. #include "editl.h"
  3.  
  4. #define min(x,y) (x>y)?y:x
  5. #define max(x,y) (x<y)?y:x
  6.  
  7. Ask::Ask(rect coordinates, char* tabName, KH_STRTABLE* fields,
  8.            char* fName, int s,
  9.            BORDERS b_type, int res, int pat, int hdr_pat)
  10.    :  KH_AbstractTable(coordinates, fName, "", s,
  11.            /*columnNumber*/ fields->used,
  12.            /*int* wid */ NULL, /*int* colNum */ NULL,
  13.            b_type, NO_BORDER, res, pat, hdr_pat)
  14.     {
  15.     tableName = strdup(tabName);
  16.     mode = KH_EDIT_TABLE;
  17.  
  18.     querry = new KH_STRTABLE(fields->used, NULL);
  19.     examples = new KH_STRTABLE(fields->used, NULL);
  20.     checkers = new char[255];
  21.     memset(checkers, '\0', 255);
  22.     fieldNames = fields;
  23.  
  24.     colNumbers = new int[nColumns + 1];
  25.     for(int i = 0; i < nColumns + 1; i++)
  26.     colNumbers[i] = i;
  27.     iColWidth = new int[nColumns + 1];
  28.     for(xCurs = 0; xCurs < nColumns; xCurs++)
  29.     {
  30.     iColWidth[xCurs] = getFieldMaxWidth();
  31.     }
  32.     xCurs = 0;
  33.  
  34.     yScreen = 2;
  35.     }
  36. /////////////////////////////////////
  37. void Ask::getFieldName(char* name, int n)
  38.     {
  39.     strcpy(name, fieldNames->strings[n - 1]);
  40.     }
  41. /////////////////////////////////////
  42. int Ask::getFieldMaxWidth()
  43.     {
  44.     int x = 0;
  45.     if(querry->strings[xCurs][0] != '\0')
  46.     x = strlen(querry->strings[xCurs]);
  47.     if(examples->strings[xCurs][0] != '\0')
  48.     x = strlen(examples->strings[xCurs]);
  49.  
  50.     return max(x + 4, strlen(fieldNames->strings[xCurs]) + 2);
  51.     }
  52. //////////////////////////////////////
  53. void Ask::show()
  54.     {
  55.     KH_AbstractTable::show();
  56.     setfillstyle(SOLID_FILL, pColorSet->colors.HILITE_COLOR);
  57.     setcolor(pColorSet->colors.FILL_COLOR);
  58.     rect r = bound();
  59.     r.origin.X = r.corner.X - (strlen(tableName) + 1) * pScreenSet->cell_width;
  60.     r.origin.Y = r.corner.Y - pScreenSet->standart_height;
  61.     bar(r);
  62.     settextstyle(DEFAULT_FONT, HORIZ_DIR, 1);
  63.     settextjustify(LEFT_TEXT, BOTTOM_TEXT);
  64.     outtextxy(r.origin.X + 1, r.corner.Y, tableName);
  65.     }
  66. //////////////////////////////////////
  67. void Ask::showField(int sx, int x, int y, int flag, int /*field_type*/)
  68.     {
  69.     rect r = user_screen();
  70.     int endx = r.corner.X < r.origin.X + screenXL(sx + iColWidth[x] - 1)
  71.         ? r.corner.X : r.origin.X + screenXL(sx + iColWidth[x] - 1);
  72.     setviewport(r.origin.X + screenXL(sx + 1), r.origin.Y,
  73.         endx, r.corner.Y, 1);
  74.  
  75.     if(flag)
  76.     bar(2, screenYT(y - yStart + 1) + 2,
  77.         endx - 2, screenYT(y - yStart + 2) - 2);
  78.     settextjustify(LEFT_TEXT, CENTER_TEXT);
  79.  
  80.     if(checkers[x])
  81.     {
  82.     char buf[2];
  83.     buf[0] = '√';
  84.     buf[1] = '\0';
  85.     setcolor(pColorSet->colors.MARK_COLOR);
  86.     setfillstyle(SOLID_FILL, pColorSet->colors.MARK_BAK_COLOR);
  87.     bar(0, pScreenSet->cell_height + 2,
  88.         pScreenSet->cell_width, 2 * pScreenSet->cell_height - 2);
  89.     outtextxy(0, 3 * pScreenSet->cell_height / 2, buf);
  90.     }
  91.  
  92.     int exs = pScreenSet->cell_width;
  93.     int exe = exs + strlen(examples->strings[x]) * pScreenSet->cell_width;
  94.     if(examples->strings[x][0] != '\0')
  95.     {
  96.     setcolor(pColorSet->colors.ATTR_COLOR);
  97.     setfillstyle(SOLID_FILL, pColorSet->colors.FILL_COLOR);
  98.  
  99.     bar(exs, pScreenSet->cell_height + 2, exe,
  100.         2 * pScreenSet->cell_height - 2);
  101.     outtextxy(exs, 3 * pScreenSet->cell_height / 2, examples->strings[xCurs]);
  102.     }
  103.  
  104.     setcolor(BLACK);
  105.     if(querry->strings[x][0] != '\0')
  106.     outtextxy(exe, 3 * pScreenSet->cell_height / 2, querry->strings[x]);
  107.  
  108.     setviewport(0, 0, getmaxx(), getmaxy(), 1);
  109.     }
  110. ///////////////////////////////
  111. void Ask::editField()
  112.     {
  113.     rect r = user_screen();
  114.  
  115.     setviewport(r.origin.X, r.origin.Y, getmaxx(), getmaxy(), 1);
  116.     EditLine* editl
  117.         = new EditLine(loc(0, 0),
  118.                   min(iColWidth[colNumbers[xCurs]], rectangle.width() - 3),
  119.           QUERRY_MAX_LEN, BUTTON_BORDER, 0, 1);
  120.     editl->put_string(querry->strings[xCurs]);
  121.     editl->show();
  122. //    do {
  123.     editl->exe();
  124. //       } while(!check_type(type, global[global_num]));
  125.  
  126.     setviewport(0, 0, getmaxx(), getmaxy(), 1);
  127.     delete querry->strings[xCurs];
  128.     querry->strings[xCurs] = strdup(global[global_num]);
  129.     delete editl;
  130.  
  131.     if(strlen(querry->strings[xCurs]) + strlen(examples->strings[xCurs])
  132.     + 3 > iColWidth[colNumbers[xCurs]])
  133.     {
  134.     iColWidth[colNumbers[xCurs]] = strlen(querry->strings[xCurs])
  135.          + strlen(examples->strings[xCurs]) + 3;
  136.     show();
  137.     }
  138.     else
  139.     {
  140.     r.origin.Y += pScreenSet->cell_height;
  141.     line_table(r);
  142.     setfillstyle(SOLID_FILL, WHITE);
  143.     showField(xPos, colNumbers[xCurs], yCurs, 1, getFieldType(colNumbers[xCurs], yCurs));
  144.     }
  145.     mouseShowCursor();
  146.     }
  147. ////////////////////////////////////
  148. int Ask::searchField(int ask)
  149.     {
  150.     if(!ask)
  151.     {
  152.     if(checkers[xCurs])
  153.         checkers[xCurs] = '\0';
  154.     else
  155.         checkers[xCurs] = '\1';
  156.     return 1;
  157.     }
  158.     rect r = user_screen();
  159.  
  160.     setviewport(r.origin.X, r.origin.Y, getmaxx(), getmaxy(), 1);
  161.     EditLine* editl
  162.     = new EditLine(loc(0, 0),
  163.         min(iColWidth[colNumbers[xCurs]], rectangle.width() - 3),
  164.           EXAMPLE_MAX_LEN, BUTTON_BORDER, 0, 1);
  165.     editl->put_string(examples->strings[xCurs]);
  166.     editl->show();
  167. //    do {
  168.      editl->exe();
  169. //       } while(!check_type(type, global[global_num]));
  170.  
  171.     delete examples->strings[xCurs];
  172.     examples->strings[xCurs] = strdup(global[global_num]);
  173.     delete editl;
  174.  
  175.     if(strlen(querry->strings[xCurs]) + strlen(examples->strings[xCurs])
  176.     + 3 > iColWidth[colNumbers[xCurs]])
  177.     iColWidth[colNumbers[xCurs]] = strlen(querry->strings[xCurs])
  178.          + strlen(examples->strings[xCurs]) + 3;
  179.  
  180.     setviewport(0, 0, getmaxx(), getmaxy(), 1);
  181.  
  182.     r.origin.Y += pScreenSet->cell_height;
  183.     line_table(r);
  184.  
  185.     mouseShowCursor();
  186.     setfillstyle(SOLID_FILL, WHITE);
  187.  
  188.     return 1;
  189.     }
  190. /////////////////////////////
  191. void Ask::touch(int)
  192.     {
  193.     global_num = fieldNames->used;
  194.     delete global[0];
  195.     global[0] = strdup("Ask");
  196.     for(int i = 1; i <= global_num; i++)
  197.     {
  198.     delete global[i];
  199.     global[i] = strdup(querry->strings[i - 1]);
  200.     }
  201.  
  202.     delete global[i];
  203.     global[i++] = strdup(checkers);
  204.     delete global[i + 1];
  205.     global[i + 1] = strdup(tableName);
  206.  
  207.     for(; i <= 2 * global_num + 3; i++)
  208.     {
  209.     delete global[i];
  210.     global[i] = strdup(examples->strings[i - 1]);
  211.     }
  212.     }
  213. ///////////////////////////
  214. /*
  215. void main()
  216.     {
  217.     if(!init_KNOW_HOW())
  218.     return;
  219.     setfillstyle(SOLID_FILL, pColorSet->colors.BAK_COLOR);
  220.     bar(0, 0, getmaxx(), getmaxy());
  221.  
  222.     char* s[] = { "One", "Two", "Three", "Four", "Five" };
  223.     KH_STRTABLE* fields = new KH_STRTABLE(5, s);
  224.  
  225.     Ask w(rect(10, 10, 50, 13), "demo.db", fields, "window.pcy", 0);
  226.  
  227.     w.show_window();
  228.     w.exe();
  229.     w.hide();
  230.  
  231.     close_KNOW_HOW();
  232.     closegraph();
  233.     }
  234. */